/*
 * NowyRaport.java
 *
 * Created on 2011-04-03, 12:25:33
 * Updated on 2011-05-25
 */
package medimg.widok.raporty;

import java.sql.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import medimg.model.NieedytowalnyModelTabeli;
import medimg.scheme.Badania;
import medimg.scheme.Pacjenci;
import medimg.scheme.Personel;
import medimg.scheme.RodzajBadan;
import medimg.scheme.Zdjecia;
import org.hibernate.JDBCException;
import org.hibernate.Session;

/**
 * Klasa zarządzająca generacją raportów
 * @author PSI
 */
public class NowyRaport extends javax.swing.JDialog {

    private NieedytowalnyModelTabeli modelTabeli;
    private DefaultComboBoxModel modelRaportow;
    private DefaultComboBoxModel modelPacjentow;
    private DefaultComboBoxModel modelLekarzy;
    private DefaultComboBoxModel modelBadan;
    private DefaultComboBoxModel modelMiesiacaOd;
    private DefaultComboBoxModel modelMiesiacaDo;
    private DefaultComboBoxModel modelRokuOd;
    private DefaultComboBoxModel modelRokuDo;
    private ArrayList<Badania> listaBadan;
    private ArrayList<RodzajBadan> listaRodzajow;
    private ArrayList<Pacjenci> listaPacjentow;
    private ArrayList<Personel> listaLekarzy;
    private ArrayList<Zdjecia> listaZdjec;
    private RodzajBadan wybranyRodzaj;
    private Pacjenci wybranyPacjent;
    private Personel wybranyLekarz;
    private Date dataOd;
    private Date dataDo;
    private String wyborRaportu;

    /** Tworzy nowe okno NowyRaport */
    public NowyRaport(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        this.setLocationRelativeTo(parent);
        modelRaportow = new DefaultComboBoxModel();
        jComboBoxTyp.setModel(modelRaportow);
        modelBadan = new DefaultComboBoxModel();
        jComboBoxBadanie.setModel(modelBadan);
        modelPacjentow = new DefaultComboBoxModel();
        jComboBoxPacjent.setModel(modelPacjentow);
        modelLekarzy = new DefaultComboBoxModel();
        jComboBoxLekarz.setModel(modelLekarzy);
        modelMiesiacaOd = new DefaultComboBoxModel();
        jComboBoxMiesiacOd.setModel(modelMiesiacaOd);
        modelMiesiacaDo = new DefaultComboBoxModel();
        jComboBoxMiesiacDo.setModel(modelMiesiacaDo);
        modelRokuOd = new DefaultComboBoxModel();
        jComboBoxRokOd.setModel(modelRokuOd);
        modelRokuDo = new DefaultComboBoxModel();
        jComboBoxRokDo.setModel(modelRokuDo);
        modelTabeli = new NieedytowalnyModelTabeli();
        modelTabeli.addColumn("ID");
        modelTabeli.addColumn("DATA");
        modelTabeli.addColumn("PRACOWNIK");
        modelTabeli.addColumn("PACJENT");
        modelTabeli.addColumn("RODZAJ BADANIA");
        modelTabeli.addColumn("DIAGNOZA");
        modelTabeli.addColumn("ZDJĘCIE");
        inicjujDane();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jComboBox3 = new javax.swing.JComboBox();
        jComboBoxTyp = new javax.swing.JComboBox();
        jButtonGeneruj = new javax.swing.JButton();
        jButtonAnuluj = new javax.swing.JButton();
        jLabelTyp = new javax.swing.JLabel();
        jComboBoxBadanie = new javax.swing.JComboBox();
        jComboBoxPacjent = new javax.swing.JComboBox();
        jLabelBadanie = new javax.swing.JLabel();
        jLabelPacjent = new javax.swing.JLabel();
        jComboBoxLekarz = new javax.swing.JComboBox();
        jLabelLekarz = new javax.swing.JLabel();
        jComboBoxMiesiacOd = new javax.swing.JComboBox();
        jComboBoxRokOd = new javax.swing.JComboBox();
        jLabelDataOd = new javax.swing.JLabel();
        jComboBoxMiesiacDo = new javax.swing.JComboBox();
        jComboBoxRokDo = new javax.swing.JComboBox();
        jLabelDataDo = new javax.swing.JLabel();

        jComboBox3.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Item 1", "Item 2", "Item 3", "Item 4" }));

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Nowy raport");
        setModal(true);
        setName("NowyRaport"); // NOI18N
        setResizable(false);

        jComboBoxTyp.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jComboBoxTypActionPerformed(evt);
            }
        });

        jButtonGeneruj.setText("Generuj");
        jButtonGeneruj.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonGenerujActionPerformed(evt);
            }
        });

        jButtonAnuluj.setText("Anuluj");
        jButtonAnuluj.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonAnulujActionPerformed(evt);
            }
        });

        jLabelTyp.setText("Typ");

        jComboBoxBadanie.setEnabled(false);

        jComboBoxPacjent.setEnabled(false);

        jLabelBadanie.setText("Badanie");

        jLabelPacjent.setText("Pacjent");

        jComboBoxLekarz.setEnabled(false);

        jLabelLekarz.setText("Lekarz");

        jComboBoxMiesiacOd.setEnabled(false);

        jComboBoxRokOd.setEnabled(false);

        jLabelDataOd.setText("Data od");

        jComboBoxMiesiacDo.setEnabled(false);

        jComboBoxRokDo.setEnabled(false);

        jLabelDataDo.setText("Data do");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelTyp)
                    .addComponent(jLabelBadanie)
                    .addComponent(jLabelPacjent)
                    .addComponent(jLabelLekarz)
                    .addComponent(jLabelDataOd)
                    .addComponent(jLabelDataDo))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jComboBoxMiesiacDo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jComboBoxRokDo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jComboBoxMiesiacOd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jComboBoxRokOd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(jComboBoxTyp, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jComboBoxBadanie, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jComboBoxPacjent, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jComboBoxLekarz, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(149, Short.MAX_VALUE))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(127, Short.MAX_VALUE)
                .addComponent(jButtonGeneruj)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jButtonAnuluj)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelTyp)
                    .addComponent(jComboBoxTyp, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jComboBoxBadanie, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelBadanie))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jComboBoxPacjent, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelPacjent))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jComboBoxLekarz, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelLekarz))
                .addGap(11, 11, 11)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelDataOd)
                    .addComponent(jComboBoxMiesiacOd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jComboBoxRokOd, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelDataDo)
                    .addComponent(jComboBoxMiesiacDo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jComboBoxRokDo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonAnuluj)
                    .addComponent(jButtonGeneruj))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButtonAnulujActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAnulujActionPerformed
        this.dispose();
    }//GEN-LAST:event_jButtonAnulujActionPerformed

    private void jButtonGenerujActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonGenerujActionPerformed
        if (walidacjaDanych()) {
            dataOd = toSqlDate(przeksztalcDate(1, Integer.parseInt(jComboBoxMiesiacOd.getSelectedItem().toString()), Integer.parseInt(jComboBoxRokOd.getSelectedItem().toString())));
            dataDo = toSqlDate(przeksztalcDate(31, Integer.parseInt(jComboBoxMiesiacDo.getSelectedItem().toString()), Integer.parseInt(jComboBoxRokDo.getSelectedItem().toString())));
            if (wyborRaportu.equals("globalny")) {
                generujModelTabeli(null, null, null, dataOd, dataDo);
            } else if (wyborRaportu.equals("badania")) {
                czytajRodzaj();
                generujModelTabeli(wybranyRodzaj, null, null, dataOd, dataDo);
            } else if (wyborRaportu.equals("pacjenci")) {
                czytajPacjenta();
                generujModelTabeli(null, wybranyPacjent, null, dataOd, dataDo);
            } else if (wyborRaportu.equals("lekarze")) {
                czytajLekarza();
                generujModelTabeli(null, null, wybranyLekarz, dataOd, dataDo);
            }
            this.dispose();
        }
    }//GEN-LAST:event_jButtonGenerujActionPerformed

    private void jComboBoxTypActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jComboBoxTypActionPerformed
        if (jComboBoxTyp.getSelectedItem().equals("Wybierz typ raportu...")) {
            wyborRaportu = null;
            jComboBoxBadanie.setEnabled(false);
            jComboBoxPacjent.setEnabled(false);
            jComboBoxLekarz.setEnabled(false);
            jComboBoxMiesiacOd.setEnabled(false);
            jComboBoxMiesiacDo.setEnabled(false);
            jComboBoxRokOd.setEnabled(false);
            jComboBoxRokDo.setEnabled(false);
            jComboBoxBadanie.setModel(modelBadan);
            jComboBoxPacjent.setModel(modelPacjentow);
            jComboBoxLekarz.setModel(modelLekarzy);
            jComboBoxMiesiacOd.setModel(modelMiesiacaOd);
            jComboBoxMiesiacDo.setModel(modelMiesiacaDo);
            jComboBoxRokOd.setModel(modelRokuOd);
            jComboBoxRokDo.setModel(modelRokuDo);
        } else if (jComboBoxTyp.getSelectedItem().equals("Raport globalny")) {
            wyborRaportu = "globalny";
            jComboBoxBadanie.setEnabled(false);
            jComboBoxPacjent.setEnabled(false);
            jComboBoxLekarz.setEnabled(false);
            jComboBoxMiesiacOd.setEnabled(true);
            jComboBoxMiesiacDo.setEnabled(true);
            jComboBoxRokOd.setEnabled(true);
            jComboBoxRokDo.setEnabled(true);
        } else if (jComboBoxTyp.getSelectedItem().equals("Raport badan")) {
            wyborRaportu = "badania";
            jComboBoxBadanie.setEnabled(true);
            jComboBoxPacjent.setEnabled(false);
            jComboBoxLekarz.setEnabled(false);
            jComboBoxMiesiacOd.setEnabled(true);
            jComboBoxMiesiacDo.setEnabled(true);
            jComboBoxRokOd.setEnabled(true);
            jComboBoxRokDo.setEnabled(true);
        } else if (jComboBoxTyp.getSelectedItem().equals("Raport pacjentow")) {
            wyborRaportu = "pacjenci";
            jComboBoxPacjent.setEnabled(true);
            jComboBoxBadanie.setEnabled(false);
            jComboBoxLekarz.setEnabled(false);
            jComboBoxMiesiacOd.setEnabled(true);
            jComboBoxMiesiacDo.setEnabled(true);
            jComboBoxRokOd.setEnabled(true);
            jComboBoxRokDo.setEnabled(true);
        } else if (jComboBoxTyp.getSelectedItem().equals("Raport lekarzy")) {
            wyborRaportu = "lekarze";
            jComboBoxLekarz.setEnabled(true);
            jComboBoxPacjent.setEnabled(false);
            jComboBoxBadanie.setEnabled(false);
            jComboBoxMiesiacOd.setEnabled(true);
            jComboBoxMiesiacDo.setEnabled(true);
            jComboBoxRokOd.setEnabled(true);
            jComboBoxRokDo.setEnabled(true);
        }
    }//GEN-LAST:event_jComboBoxTypActionPerformed

    /**
     * Metoda zwracająca aktualny model tabeli głównej
     * @return model tabeli głównej
     */
    public DefaultTableModel getModelTabeli() {
        return modelTabeli;
    }

    /**
     * Metoda tworząca model tabeli głównej na podstawie podanych danych
     *
     * @param rodzaj obiekt rodzaju badań
     * @param pacjent obiekt reprezentujący pacjenta
     * @param lekarz obiekt reprezentujący lekarza
     * @param dataOd obiekt daty początkowej
     * @param dataDo obiekt daty końcowej
     */
    private void generujModelTabeli(RodzajBadan rodzaj, Pacjenci pacjent, Personel lekarz, Date dataOd, Date dataDo) {
        if (!medimg.hibernate.HibernateUtil.isOpen()) {
            JOptionPane.showConfirmDialog(this, "Najpierw podłącz się do bazy.", "Nie polaczono", JOptionPane.DEFAULT_OPTION);
            return;
        }

        listaBadan = null;
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        try {
            session.beginTransaction(); //rozpoczecie transakcji
            if (rodzaj != null)
                listaBadan = new ArrayList<Badania>(session.createQuery("from Badania where Rodzaj = '"+rodzaj.getId()+"' and Data >= '"+dataOd+"' and Data <= '"+dataDo+"'").list());
            if (pacjent != null)
                listaBadan = new ArrayList<Badania>(session.createQuery("from Badania where Pacjent = '"+pacjent.getId()+"' and Data >= '"+dataOd+"' and Data <= '"+dataDo+"'").list());
            if (lekarz != null)
                listaBadan = new ArrayList<Badania>(session.createQuery("from Badania where Lekarz = '"+lekarz.getId()+"' and Data >= '"+dataOd+"' and Data <= '"+dataDo+"'").list());
            if (rodzaj == null && pacjent == null && lekarz == null)
                listaBadan = new ArrayList<Badania>(session.createQuery("from Badania where Data >= '"+dataOd+"' and Data <= '"+dataDo+"'").list());
            session.getTransaction().commit();
        } catch (JDBCException ex) {
            session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }

        RodzajBadan r = new RodzajBadan();
        Pacjenci p = new Pacjenci();
        Personel l = new Personel();
        Zdjecia z = new Zdjecia();

        if (listaBadan != null && !listaBadan.isEmpty()) {
            for (Badania bad : listaBadan) {
                Session session2 = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession();
                try {
                    session2.beginTransaction(); //rozpoczecie transakcji
                    r = (RodzajBadan) (session2.createQuery("from RodzajBadan where id = '" + bad.getRodzaj() + "'").uniqueResult());
                    p = (Pacjenci) (session2.createQuery("from Pacjenci where id = '" + bad.getPacjent() + "'").uniqueResult());
                    l = (Personel) (session2.createQuery("from Personel where id = '" + bad.getLekarz() + "'").uniqueResult());
                    
                    for (Zdjecia zdj : listaZdjec) {
                        if (zdj.getBadanie() == bad.getId()) {
                            z = (Zdjecia) (session2.createQuery("from Zdjecia where Badanie = '" + bad.getId() + "'").uniqueResult());
                            break;
                        } else
                            z = new Zdjecia();
                    }
                    session2.getTransaction().commit();
                } catch (JDBCException ex) {
                    session2.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
                }

                Object[] dane = {bad.getId(), bad.getData(), l.getNazwisko()+" "+l.getImie(), p.getNazwisko()+" "+p.getImie(), r.getNazwa(), bad.getDiagnoza(), z.getNazwaPliku()};
                modelTabeli.addRow(dane);                
            }
        } else {
            JOptionPane.showConfirmDialog(this, "Brak badan!", "Brak danych", JOptionPane.DEFAULT_OPTION);
        }
    }

    /**
     * Metoda przygotowująca dane daty podanej przez użytkownika do formatu przetworzalnego
     * @param dzien numer dnia
     * @param miesiac numer miesiąca
     * @param rok numer roku
     * @return tekst daty
     */
    private String przeksztalcDate(int dzien, int miesiac, int rok) {
        String wynik = rok+"-"+miesiac+"-"+dzien;
        return wynik;
    }

    /**
     * Metoda przekształcająca podany tekst daty w bazodanową datę
     *
     * @param strDate tekst daty
     * @return przetworzoną datę
     */
    private java.sql.Date toSqlDate(String strDate) {
        DateFormat dateFrm = new SimpleDateFormat("yyyy-MM-dd");
        java.util.Date myDate = new java.util.Date();
        java.sql.Date sqlDate;

        try {
            myDate = dateFrm.parse(strDate);
            sqlDate = new java.sql.Date(myDate.getTime());
        } catch (Exception e) {
            sqlDate = null;
        }

        return (sqlDate);
    }

     /**
     * Metoda odczytująca wybór rodzaju badania przez użytkownika
     */
    private void czytajRodzaj() {
        if (!medimg.hibernate.HibernateUtil.isOpen()) {
            JOptionPane.showConfirmDialog(this, "Najpierw podłącz się do bazy.", "Nie polaczono", JOptionPane.DEFAULT_OPTION);
            return;
        }
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        wybranyRodzaj = null;
        try {
            session.beginTransaction(); //rozpoczecie transakcji
            wybranyRodzaj = (RodzajBadan)(session.createQuery("from RodzajBadan where Nazwa = '" + jComboBoxBadanie.getSelectedItem().toString() + "'").uniqueResult());
            session.getTransaction().commit();
        } catch (JDBCException ex) {
            session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }
    }

    /**
     * Metoda odczytująca wybór pacjenta przez użytkownika
     */
    private void czytajPacjenta() {
        if (!medimg.hibernate.HibernateUtil.isOpen()) {
            JOptionPane.showConfirmDialog(this, "Najpierw podłącz się do bazy.", "Nie polaczono", JOptionPane.DEFAULT_OPTION);
            return;
        }
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        wybranyPacjent = null;
        int indeks;
        indeks = jComboBoxPacjent.getSelectedItem().toString().indexOf(" ");
        String nazwiskoPacjenta = jComboBoxPacjent.getSelectedItem().toString().substring(0, indeks);
        String imiePacjenta = jComboBoxPacjent.getSelectedItem().toString().substring(indeks + 1, jComboBoxPacjent.getSelectedItem().toString().length());

        try {
            session.beginTransaction(); //rozpoczecie transakcji
            wybranyPacjent = (Pacjenci) (session.createQuery("from Pacjenci where Nazwisko = '" + nazwiskoPacjenta + "' and Imie = '" + imiePacjenta + "'").uniqueResult());
            session.getTransaction().commit();
        } catch (JDBCException ex) {
            session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }
    }

    /**
     * Metoda odczytująca lekarza wybranego przez użytkownika 
     */
    private void czytajLekarza() {
        if (!medimg.hibernate.HibernateUtil.isOpen()) {
            JOptionPane.showConfirmDialog(this, "Najpierw podłącz się do bazy.", "Nie polaczono", JOptionPane.DEFAULT_OPTION);
            return;
        }
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        wybranyLekarz = null;
        int indeks;
        indeks = jComboBoxLekarz.getSelectedItem().toString().indexOf(" ");
        String nazwiskoLekarza = jComboBoxLekarz.getSelectedItem().toString().substring(0, indeks);
        String imieLekarza = jComboBoxLekarz.getSelectedItem().toString().substring(indeks + 1, jComboBoxLekarz.getSelectedItem().toString().length());

        try {
            session.beginTransaction(); //rozpoczecie transakcji
            wybranyLekarz = (Personel)(session.createQuery("from Personel where Nazwisko = '" + nazwiskoLekarza + "' and Imie = '" + imieLekarza + "'").uniqueResult());
            session.getTransaction().commit();
        } catch (JDBCException ex) {
            session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }
    }

    /**
     * Metoda sprawdzająca czy użytkownik dokonał wyboru we wszystkich wymagających polach
     * @return czy walidacja przeszła poprawnie
     */
    private boolean walidacjaDanych() {
        if (jComboBoxTyp.getSelectedItem().equals("Wybierz typ raportu...")) {
            JOptionPane.showConfirmDialog(this, "Nie wybrano typu raportu!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if(jComboBoxBadanie.getSelectedItem().equals("Wybierz typ badania...") && jComboBoxBadanie.isEnabled()) {
            JOptionPane.showConfirmDialog(this, "Nie wybrano rodzaju badania!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if (jComboBoxPacjent.getSelectedItem().equals("Wybierz pacjenta...") && jComboBoxPacjent.isEnabled()) {
            JOptionPane.showConfirmDialog(this, "Nie wybrano pacjenta!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if (jComboBoxLekarz.getSelectedItem().equals("Wybierz lekarza...") && jComboBoxLekarz.isEnabled()) {
            JOptionPane.showConfirmDialog(this, "Nie wybrano lekarza!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if (jComboBoxMiesiacOd.getSelectedItem().equals("Miesiac") && jComboBoxMiesiacOd.isEnabled()) {
            JOptionPane.showConfirmDialog(this, "Wybierz miesiac!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if (jComboBoxMiesiacDo.getSelectedItem().equals("Miesiac") && jComboBoxMiesiacDo.isEnabled()) {
            JOptionPane.showConfirmDialog(this, "Wybierz miesiac!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if (jComboBoxRokOd.getSelectedItem().equals("Rok") && jComboBoxRokOd.isEnabled()) {
            JOptionPane.showConfirmDialog(this, "Wybierz rok!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if (jComboBoxRokDo.getSelectedItem().equals("Rok") && jComboBoxRokDo.isEnabled()) {
            JOptionPane.showConfirmDialog(this, "Wybierz rok!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        }
        return true;
    }
    
    /**
     * Metoda tworząca modele comboboxów wyciągając z bazy danych potrzebne informacje - lekarzy, pacjentów, badania
     */
    private void inicjujDane() {
        if (!medimg.hibernate.HibernateUtil.isOpen()) {
            JOptionPane.showConfirmDialog(this, "Najpierw podłącz się do bazy.", "Nie polaczono", JOptionPane.DEFAULT_OPTION);
            return;
        }
        modelRaportow.removeAllElements();
        modelBadan.removeAllElements();
        modelPacjentow.removeAllElements();
        modelLekarzy.removeAllElements();
        modelMiesiacaOd.removeAllElements();
        modelMiesiacaDo.removeAllElements();
        modelRokuOd.removeAllElements();
        modelRokuDo.removeAllElements();
        listaRodzajow = null;
        listaPacjentow = null;
        listaLekarzy = null;
        listaZdjec = null;
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        try {
            session.beginTransaction(); //rozpoczecie transakcji
            listaRodzajow = new ArrayList<RodzajBadan>(session.createQuery("from RodzajBadan").list());
            listaPacjentow = new ArrayList<Pacjenci>(session.createQuery("from Pacjenci").list());
            listaLekarzy = new ArrayList<Personel>(session.createQuery("from Personel").list());
            listaZdjec = new ArrayList<Zdjecia>(session.createQuery("from Zdjecia").list());
            session.getTransaction().commit();
        } catch (JDBCException ex) {
            session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }

        modelMiesiacaOd.addElement("Miesiac");
        modelMiesiacaDo.addElement("Miesiac");
        modelRokuOd.addElement("Rok");
        modelRokuDo.addElement("Rok");

        for (int i = 1; i <= 12; i++) {
            modelMiesiacaOd.addElement(i);
            modelMiesiacaDo.addElement(i);
        }
        for (int j = 2000; j <= 2020; j++) {
            modelRokuOd.addElement(j);
            modelRokuDo.addElement(j);
        }

        modelRaportow.addElement("Wybierz typ raportu...");
        modelRaportow.addElement("Raport globalny");

        if (listaRodzajow != null && !listaRodzajow.isEmpty()) {
            modelBadan.addElement("Wybierz badanie...");
            modelRaportow.addElement("Raport badan");
            for (RodzajBadan bad : listaRodzajow) {
                modelBadan.addElement(bad.getNazwa());
            }
        } else {
            modelBadan.addElement("Brak definicji typów badań!");
        }

        if (listaPacjentow != null && !listaPacjentow.isEmpty()) {
            modelPacjentow.addElement("Wybierz pacjenta...");
            modelRaportow.addElement("Raport pacjentow");
            for (Pacjenci pac : listaPacjentow) {
                modelPacjentow.addElement(pac.getNazwisko() + " " + pac.getImie());
            }
        } else {
            modelPacjentow.addElement("Brak pacjentow!");
        }

        if (listaLekarzy != null && !listaLekarzy.isEmpty()) {
            modelLekarzy.addElement("Wybierz lekarza...");
            modelRaportow.addElement("Raport lekarzy");
            for (Personel per : listaLekarzy) {
                modelLekarzy.addElement(per.getNazwisko() + " " + per.getImie());
            }
        } else {
            modelLekarzy.addElement("Brak lekarzy!");
        }
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                NowyRaport dialog = new NowyRaport(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {

                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonAnuluj;
    private javax.swing.JButton jButtonGeneruj;
    private javax.swing.JComboBox jComboBox3;
    private javax.swing.JComboBox jComboBoxBadanie;
    private javax.swing.JComboBox jComboBoxLekarz;
    private javax.swing.JComboBox jComboBoxMiesiacDo;
    private javax.swing.JComboBox jComboBoxMiesiacOd;
    private javax.swing.JComboBox jComboBoxPacjent;
    private javax.swing.JComboBox jComboBoxRokDo;
    private javax.swing.JComboBox jComboBoxRokOd;
    private javax.swing.JComboBox jComboBoxTyp;
    private javax.swing.JLabel jLabelBadanie;
    private javax.swing.JLabel jLabelDataDo;
    private javax.swing.JLabel jLabelDataOd;
    private javax.swing.JLabel jLabelLekarz;
    private javax.swing.JLabel jLabelPacjent;
    private javax.swing.JLabel jLabelTyp;
    // End of variables declaration//GEN-END:variables
}
